<?php

class User extends fvUser implements iLogger {
    
    protected $currentEntity = '';
    
    function __construct () {
        $this->currentEntity = __CLASS__;
        parent::__construct(fvSite::$fvConfig->get("entities.{$this->currentEntity}.fields"), 
                            fvSite::$fvConfig->get("entities.{$this->currentEntity}.table_name"), 
                            fvSite::$fvConfig->get("entities.{$this->currentEntity}.primary_key", "id"));
    }
    
    public function validateLogin($value) {
        $valid = (preg_match("/^[a-z_\s0-9]{4,}$/i", $value) > 0);
        $users = UserManager::getInstance()->getCount('login="'.$value.'"');
        $valid = $valid && ($users == 0);
        if ($users != 0){
        	$this->setValidationResult("login", ($users == 0), "Пользователь с таким логином уже существует.");
        }else {
        	$this->setValidationResult("login", $valid, "Логин должен состоять только из символов латинского алфавита, содержать символ '_' или ' ' и состоять из более чем 4-х символов");	
        }
        return $valid;
    }
    
    public function validatePassword($value) {
        
        $valid = (preg_match("/^[a-z_\s0-9]{4,}$/i", $value) > 0);
        $this->setValidationResult("password", $valid, "Пароль должен состоять только из символов латинского алфавита и быть более 4-х символов.");
        
        $m = fvRequest::getInstance()->getRequestParameter("m");
        $confirmPassword = $m['password1'];
        $valid = $valid && ($confirmPassword == $value);
        $this->setValidationResult("password1", ($confirmPassword == $value), "Пароль и подтверждение не совпадают");
        
        return $valid;
    }

    public function validateEmail($value) {
        $valid = (preg_match("/^[a-z0-9_\-\.]+@[a-z_\-\.]+\.[a-z]{2,3}$/i", $value) > 0);
        
        $users = UserManager::getInstance()->getCount('email="'.$value.'"');
        $valid = $valid && ($users == 0);
	    if ($users != 0){
        	$this->setValidationResult("email", ($users == 0), "Пользователь с таким e-mail уже существует.");
        }else {
        	$this->setValidationResult("email", $valid, 'Введите корректный e-mail');	
        }
        
        return $valid;
    }
    
    function check_acl ($acl_name, $action = 'index') {
    	if ($this->isRoot()) return true;
    	
    	if (!is_array($acl_name)) $acl_name = array($acl_name);
    	
    	if (is_array($acl_name[$action])) $acl_check = $acl_name[$action];
    	else $acl_check = $acl_name;
    	
    	return (count(array_intersect($this->get("permitions"), $acl_check)) > 0);
    }
    
    function isRoot() {
        return $this->get("is_root");
    }
    
    function getLogin() {
        return $this->login;
    }
    
    function getFullName() {
        return $this->full_name;
    }
    
    public function getLogMessage($operation) {
        $message = "Пользователь был ";
        switch ($operation) {
            case Log::OPERATION_INSERT: $message .= "создан ";break;
            case Log::OPERATION_UPDATE: $message .= "изменен ";break;
            case Log::OPERATION_DELETE: $message .= "удален ";break;
            case Log::OPERATION_ERROR: $message = "Произошла ошибка при операции с записью ";break;
        }
        $user = fvSite::$fvSession->getUser();
        if ($user)
       	$message .= "в ".date("Y-m-d H:i:s").". Пользователь [".$user->getPk()."] " . $user->getLogin() . " (" . $user->getFullName() . ")";
       	else 
       	$message .= "в ".date("Y-m-d H:i:s").".";
        return $message;    
    }
    
    public function getLogName() {
        return $this->full_name;    
    }
    
    public function putToLog($operation) {
        $logMessage = new Log();
        $logMessage->operation = $operation;
        $logMessage->object_type = __CLASS__;
        $logMessage->object_name = (fvSite::$fvSession->getUser())?$this->getLogName():'';
        $logMessage->object_id = $this->getPk();
        $logMessage->manager_id = (fvSite::$fvSession->getUser())?fvSite::$fvSession->getUser()->getPk():0;
        $logMessage->message = $this->getLogMessage($operation);
        $logMessage->edit_link = fvSite::$fvConfig->get('dir_web_root')."users/edit/?id=".$this->getPk();
        $logMessage->save();
    }
}

?>
